<?php
class PeopleController extends AppController {

	var $name = 'People';
	var $uses = array('Person','User','Client','Turn','Agenda','Tag','PeopleProblem','ClientsPerson','InsurancesPerson','Insurance','Sign','Stateproblem','Typeindicacionmedicamento');
	
//	var $actsAs = array('Acl' => array('type' => 'controlled'));
//	var $cacheAction = false;

    function beforeFilter () {
        parent::beforeFilter();

		// Aplico el Layout segun la Vista o si es AJAX
		if ($this->RequestHandler->isAjax()) {
			$this->layout = 'ajax';
		}else{
			// Cambio la Vista por la del Rol
			$this->layout = strtolower($this->Session->read('VistaActual'));
		}
    }



	function view($id = null, $tab_activa = null, $turno_id = 0) {

		$this->_accede('accede_hce');

		$evoluciona_problemas = $this->_accede('evoluciona_problemas','retorna');
		$this->set('evoluciona_problemas',$evoluciona_problemas);

		$asocia_medicamentos_paciente = $this->_accede('asocia_medicamentos_paciente','retorna');
		$this->set('asocia_medicamentos_paciente',$asocia_medicamentos_paciente);

		$asocia_signos_vitales_paciente = $this->_accede('asocia_signos_vitales_paciente','retorna');
		$this->set('asocia_signos_vitales_paciente',$asocia_signos_vitales_paciente);

		$asocia_archivos_paciente = $this->_accede('asocia_archivos_paciente','retorna');
		$this->set('asocia_archivos_paciente',$asocia_archivos_paciente);

		$asocia_practicas = $this->_accede('asocia_practicas','retorna');
		$this->set('asocia_practicas',$asocia_practicas);

		$asocia_financiador_consulta = $this->_accede('asocia_financiador_consulta','retorna');
		$this->set('asocia_financiador_consulta',$asocia_financiador_consulta);

		$asocia_resultados_paciente = $this->_accede('asocia_resultados_paciente','retorna');
		$this->set('asocia_resultados_paciente',$asocia_resultados_paciente);



		$this->Person->recursive = 0;
		if (!$id) {
			$this->Session->setFlash(__('Invalid person', true));
			$this->redirect('/dashboards');
		}

		if (!$tab_activa) {
			$tab_activa = 3; // Evoluciones
		}

		$tags_paciente = $this->Person->PeopleProblem->find('all', array(
								'conditions' => array(
													'Person.id' => $id,
													'Tag.name <>' => "",
												),
								'fields' => array('Problem.name','Tag.name'),
				) );

		$pro_pacientes = $this->Person->PeopleProblem->find('all', array(
								'conditions' => array(
													'PeopleProblem.person_id' => $id,
												),
								'fields' => array('Problem.id','Problem.name'),
								'order' => array('Problem.name')
				) );
		$problemas_pacientes = array();
		if ($pro_pacientes){
			foreach($pro_pacientes as $pp){
				$problemas_pacientes[$pp['Problem']['id']] = $pp['Problem']['name'];
			
			}
		
		}

		// Verifico que el Paciente corresponda al Cliente
		$valido_cliente = $this->Person->ClientsPerson->find('first', array(
								'conditions' => array(
													'ClientsPerson.person_id' => $id,
													'ClientsPerson.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
												),
				) );

		if(!empty($valido_cliente)){
			$datos_persona = $this->Person->read(null, $id);
		}else{
			exit;
		}
		
		// Traigo los Signos Vitales
		$signos_vitales = $this->Sign->find('all', array(
						'conditions' => array(
											'NOT' => array ('Sign.id' => array('15'))
										),
						'fields' => array('Sign.name','Sign.unidad','Sign.id','Sign.quick_list','Sign.min','Sign.max'),
						'order' => array('Sign.orden')
		)) ;
		$this->set('SignosVitales', $signos_vitales);
	
		$SignosVitalesQuick = array();
		foreach($signos_vitales as $sv){ 
			if ($sv['Sign']['quick_list']==1) {
				$SignosVitalesQuick[] = $sv;
			} //endif 
		} //endforeach
		$this->set('SignosVitalesQuick', $SignosVitalesQuick);
		
		// Traigo los StateProblems
		$state_problems = $this->Stateproblem->find('all', array(
						'order' => array('Stateproblem.name')
		)) ;
		$this->set('StateProblems', $state_problems);
		
		// Traigo los Tags para mostrar en el Evolucionador
		$tags = $this->Tag->find('all', array(
						'order' => array('Tag.name')
		)) ;
		$this->set('Tags', $tags);

		// Traigo los Typeindicacionmedicamento
		$Typeindicacionmedicamento = $this->Typeindicacionmedicamento->find('all', array(
						'order' => array('Typeindicacionmedicamento.name')
		)) ;
		$this->set('Typeindicacionmedicamento', $Typeindicacionmedicamento);
		
		// Traigo la unidad indicada
		$this->loadModel('Unidad');
		$Unidad = $this->Unidad->find('list', array(
						'fields' => array('Unidad.id','Unidad.agrupador'),
						'order' => array('Unidad.agrupador')
		)) ;
		$this->set('Unidad', $Unidad);
		

		// Traigo las vias de administracion
		$this->loadModel('Via');
		$Vias = $this->Via->find('all', array(
						'order' => array('Via.name')
		));
		$this->set('Vias', $Vias);
		
		// Traigo las Frecuencias de administracion
		$this->loadModel('Frecuencia');
		$Frecuencias = $this->Frecuencia->find('all', array(
						'order' => array('Frecuencia.name')
		));
		$this->set('Frecuencias', $Frecuencias);
		
	
		//------------------------------------------------ Vademecums de este cliente
		$VademecumsCliente = $this->Session->read('VademecumsCliente');
		$this->set('VademecumsCliente',$VademecumsCliente);
		
		
		
		
		
		

		// Calculo la Edad de la Persona
		$edad = $this->obtenerEdad($datos_persona['Person']['fecha_nacimiento']);
		$this->set('edad', $edad);

		// Obtengo las Obras Sociales del Paciente
		$options      = array('conditions' => array('InsurancesPerson.person_id' => $id));
		$insurances_paciente = $this->InsurancesPerson->find('all', $options);
		$this->set('insurances_paciente', $insurances_paciente);
//		pr($insurances_paciente);
		
		//-------------------------------------------------------------------------------------------------------------------
		//---------------------------------------------------------------------------------- Obtengo Financiadores del medico
		//-------------------------------------------------------------------------------------------------------------------
		$id_user = $this->Session->read('Auth.User.id');
		$this->loadModel('InsurancesUser');
		$financiadores = $this->InsurancesUser->find('all', array(
						'conditions' => array(
											'InsurancesUser.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
											'InsurancesUser.user_id'   => $id_user,
										),
						'order'		=> array('InsurancesUser.insurance_id' => 'ASC', 'InsurancesUser.plan' => 'ASC')

		) );
		$this->set('financiadores', $financiadores);
//		pr($financiadores);

		//-------------------------------------------------------------------------------------------------------------------
		//-------------------------------------------------------------------------------------- Obtengo Productos del medico
		//-------------------------------------------------------------------------------------------------------------------
		$this->loadModel('ProductsUser');
		$productos = $this->ProductsUser->find('all', array(
						'conditions' => array(
											'ProductsUser.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
											'ProductsUser.user_id'   => $id_user,
										)
		) );		
		$this->set('productos', $productos);
//pr($productos);

		// Inicializo el Arreglo de OOSS
		$os = array();
		$x=0;

		foreach($insurances_paciente as $ip){
			$arreglo_aux_ooss   = $this->Insurance->read(null, $ip['InsurancesPerson']['insurance_id']);
			$os[$x]['ooss']     = $arreglo_aux_ooss['Insurance']['name'];
			$os[$x]['plan']     = $ip['InsurancesPerson']['nombre_plan'];
			$os[$x]['afiliado'] = $ip['InsurancesPerson']['nro_afiliado'];
			$x++;
		}
//pr($insurances_paciente);
		$this->set('ooss_paciente', $os);
		$this->set('person', $datos_persona);
		$this->set('tab_activa', $tab_activa);
		$this->set('problemas_pacientes', $problemas_pacientes);
		$this->set('tags_paciente', $tags_paciente);
		$this->set('turno_id', $turno_id);
		$this->set('doctores',$this->requestAction('/users/obtenerListadoDoctores/'.$this->Session->read('ClientesUsuarioLogueado.id')) );

	}

	/* *********************************************************************** */
	/* Carga de un Paciente													   */
	/* El parametro id_turno se utiliza para convertir un paciente temporal	   */
	/* en uno definitvo														   */
	/* *********************************************************************** */
	function add($id_turno_paciente_tmp = null) {

		$this->_accede('carga_paciente');

		//---------------------------------------------------------------------------
		//                 Puedo seguir agregando pacientes, segun el plan elegido ??
		//---------------------------------------------------------------------------
		$this->loadModel('ClientsPlan');
		$client_id = $this->Session->read('ClientesUsuarioLogueado.id');

		
		$plan_vigente = $this->ClientsPlan->find('first', array(
						'conditions' => array(
										'ClientsPlan.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
										'ClientsPlan.activo'    => 1
										),
						'order'     => array(
										'ClientsPlan.fecha_alta' => 'DESC'
										)
						));
		if ($plan_vigente['ClientsPlan']['pacientes_actuales'] < $plan_vigente['Plan']['maximo_pacientes']){
			$habilitado = true;
		} else {
			$habilitado = false;
			$this->Session->setFlash(__('No puede registrar más pacientes en el Plan actual. Favor de consultar por la actualización del Plan Actual.', true));
		}
		
	
		// Se declara al principio porque se usa también en la instancia 2
		$sexes = $this->Person->Sex->find('list');
		$typodocuments = $this->Person->Typodocument->find('list', array('order' => array('Typodocument.name')));

		if (!empty($this->data)) {

			// Valido que los Datos Ingresados estén correctos
			$this->Person->set($this->data); 
			if($this->Person->validates()) { // Si está todo Validado

				// Valido los campos ingresados
				if(!empty($this->data['Person']['name'])){
					$sql_nombre = " name:".urlencode($this->data['Person']['name']);
				}else{
					$sql_nombre = "";
				}

				if(!empty($this->data['Person']['name2'])){
					$sql_nombre2 = " name2:".urlencode($this->data['Person']['name2']);
				}else{
					$sql_nombre2 = "";
				}

				if(!empty($this->data['Person']['lastname'])){
					$sql_lastname = "lastname:".urlencode($this->data['Person']['lastname']);
				}else{
					$sql_lastname = "";
				}

				if(!empty($this->data['Person']['lastname2'])){
					$sql_lastname2 = " lastname2:".urlencode($this->data['Person']['lastname2']);
				}else{
					$sql_lastname2 = "";
				}

				if(!empty($this->data['Person']['fecha_nacimiento']['year']) AND !empty($this->data['Person']['fecha_nacimiento']['month']) AND !empty($this->data['Person']['fecha_nacimiento']['day'])){
					$sql_fecha_nacimiento = " fecha_nacimiento:".urlencode($this->data['Person']['fecha_nacimiento']['year']."-".$this->data['Person']['fecha_nacimiento']['month']."-".$this->data['Person']['fecha_nacimiento']['day']);
				}else{
					$sql_fecha_nacimiento = "";
				}

				if(!empty($this->data['Person']['typodocument_id'])){
					$sql_typodocument = " tipo_documento:".urlencode($typodocuments[$this->data['Person']['typodocument_id']]);
				}else{
					$sql_typodocument = "";
				}

				if(!empty($this->data['Person']['sex_id'])){
					$sql_sexo = " sexo:".urlencode($sexes[$this->data['Person']['sex_id']]);
				}else{
					$sql_sexo = "";
				}

				if(!empty($this->data['Person']['nro_documento'])){
					$sql_nro_documento = " nro_documento:".urlencode($this->data['Person']['nro_documento']);
				}else{
					$sql_nro_documento = "";
				}

				$txt_busqueda = trim($sql_lastname.$sql_nro_documento.$sql_nombre.$sql_nombre2.$sql_lastname2.$sql_fecha_nacimiento.$sql_typodocument.$sql_sexo);

				// Obtengo los datos solicitados con PRECISION EXACTA
				$setDatos = $this->obtenerDatossolr($txt_busqueda);


				// Si no hubo resultados exactos, extiendo la Busqueda por aproximación
				if(isset($setDatos) AND $setDatos['response']['result']['numFound'] == 0){
					// Obtengo los datos solicitados con PRECISION APROX.
					$setDatos = $this->obtenerDatossolr($txt_busqueda,0, 100000000, "", true);
				}

				$this->set('ResultadoPersonas', $setDatos);
				$this->set('busquedarealizada', "S");

				// Reenvio los datos a otra Vista para Continuar con el Alta
				$this->Session->write('ObraSocial',$this->data['OS']);
				$this->render('add2');
			 }
		}

		for($i=0;$i<=2;$i++){
			$os[$i]['id']       = 0;
			$os[$i]['plan']     = '';
			$os[$i]['afiliado'] = '';
		}
		$x = 0;
		
		$insurances = $this->Insurance->find('list');
		
		if( $id_turno_paciente_tmp > 0 ){
			$Turno = $this->Turn->read(null,$id_turno_paciente_tmp );
			if ($Turno['Turn']['person_id']==0 and !empty($Turno['Turn']['nota_json']))	{
				$this->data['Person'] = json_decode( $Turno['Turn']['nota_json'],true) ;
				$this->data['Person']['id'] = 0;
			}
		}
		


		$this->set('id_turno_paciente_tmp', $id_turno_paciente_tmp);
		$statepeople     = $this->Person->Stateperson->find('list');

		$genders         = $this->Person->Gender->find('list');
		$gruposanguineos = $this->Person->Gruposanguineo->find('list');
		$this->set(compact('statepeople', 'genders', 'sexes', 'typodocuments', 'gruposanguineos','insurances','os'));
	}

	function add2() {
		
		if (!empty($this->data)) {

			$this->Person->create();

			// Seteo datos que no vienen del Formulario
			$this->data['Client']['Client'][0] = $this->Session->read('ClientesUsuarioLogueado.id');
			$this->Person->set(array(
				'user_id' => $this->Auth->user('id'),
			));

			if ($this->Person->save($this->data)) {
				$paciente_id = $this->Person->getLastInsertID();

				$this->Session->setFlash(__('La persona ha sido cargada', true));

				// Si tengo que convertir un Paciente Temporario en una Real
				if(!empty($this->data['Person']['id_turno_paciente_tmp'])){

					// Obtengo el Registro del Turno donde está el Paciente Temporal
					$this->Turn->id = $this->data['Person']['id_turno_paciente_tmp'];

					// Actualizo el Turno
					$this->Turn->saveField('person_id',$this->Person->id);
				}

				
				/*----------------------------------------------------------------------------*/
				/* Asigno las Insurances al Paciente  										  */
				/*----------------------------------------------------------------------------*/
					$ObraSocial = $this->Session->read('ObraSocial'); 

					if(!empty($ObraSocial)){
						foreach($ObraSocial AS $id_insu_aux){

							if ($id_insu_aux['id']>0){
								// Creo un Nuevo Registro
								$this->InsurancesPerson->create();

								$this->InsurancesPerson->set(array(
															'insurance_id' 	=> $id_insu_aux['id'],
															'person_id' 	=> $paciente_id,
															'nombre_plan' 	=> $id_insu_aux['plan'],
															'nro_afiliado' 	=> $id_insu_aux['afiliado']
															)
														);
								$this->InsurancesPerson->save();
							
							
							}
						}
					}
				
				
				// Se actualizan las Personas
				$this->actualizarPersonas();

				// Se actualizan los Turnos
				$this->requestAction('/turns/actualizarturnos');

				// Se actualizan los Registros del Dashboard
				$this->requestAction('/registros/actualizarRegistros');

			} else {
				$this->Session->setFlash(__('La persona no se ha cargado. Revise los errors.', true));
			}

			$this->redirect('/people/view/'.$this->Person->id);
			exit;
		}
	}


	function edit($id = null) {
		
		$this->_accede('modifica_paciente');

		if (!$id && empty($this->data)) {
			$this->Session->setFlash(__('Invalid person', true));
			$this->redirect('/dashboards');
		}
		if (!empty($this->data)) {
			//pr($this->data);	die();
			//pr($_POST);	die();

			if(isset($_POST['eliminar_foto']) and $_POST['eliminar_foto']=='on'){
				$this->data['Person']['foto'] = '';
			} else {
				$foto = $_FILES['foto'];
				
				if( $foto['size']>0){ 
					$z             = $foto['name'];
					$NombreArchivo = $this->data['Person']['user_id'].'-'.$this->data['Person']['id'].'-'.$foto['name'];
					$this->data['Person']['foto'] = $NombreArchivo; 
					move_uploaded_file ($foto['tmp_name'], ROOT.DS.'app'.DS.'webroot'.DS.'uploads'.DS.$NombreArchivo);
				}
			}

			if ($this->Person->save($this->data)) {
				$this->Session->setFlash(__('La persona ha sido modificada', true));

				/*----------------------------------------------------------------------------*/
				/* Asigno las Insurances al Paciente  										  */
				/*----------------------------------------------------------------------------*/

					// Borro todas las Relaciones Paciente / Insurances
					$this->InsurancesPerson->deleteAll(array(
														'InsurancesPerson.person_id'   => $this->data['Person']['id']
														)
													);

					if(!empty($this->data['OS'])){
						foreach($this->data['OS'] AS $id_insu_aux){

							if ($id_insu_aux['id']>0){
								// Creo un Nuevo Registro
								$this->InsurancesPerson->create();

								$this->InsurancesPerson->set(array(
															'insurance_id' 	=> $id_insu_aux['id'],
															'person_id' 	=> $this->data['Person']['id'],
															'nombre_plan' 	=> $id_insu_aux['plan'],
															'nro_afiliado' 	=> $id_insu_aux['afiliado']
															)
														);
								$this->InsurancesPerson->save();
							
							
							}
						}
					}
				
				
				// Se actualizan las Personas
				$this->actualizarPersonas();

				$this->redirect(array('action' => 'view', $this->Person->id));
			} else {
				$this->Session->setFlash(__('La persona no ha sido modificada. Revise los datos ingresados.', true));
			}
		}
		if (empty($this->data)) {
			$this->Person->unbindModel(array('hasMany' => array('Evolution','Recomendation','PeoplePractice','PeopleProblem','PeopleRecomendation','Agenda','PeopleSign','PeopleVademecum','Person','Result','Turn')));            		
			$this->data = $this->Person->read(null, $id);
		}

//pr($this->data);		


		// Obtengo las Obras Sociales del Paciente
		$options      = array('conditions' => array('InsurancesPerson.person_id' => $id));
		$insurances_paciente = $this->InsurancesPerson->find('all', $options);
		
		for($i=0;$i<=2;$i++){
			$os[$i]['id']       = 0;
			$os[$i]['plan']     = '';
			$os[$i]['afiliado'] = '';
		}
		$x = 0;
		
		foreach($insurances_paciente as $ip){
			$os[$x]['id'] 		= $ip['InsurancesPerson']['insurance_id'];
			$os[$x]['plan']     = $ip['InsurancesPerson']['nombre_plan'];
			$os[$x]['afiliado'] = $ip['InsurancesPerson']['nro_afiliado'];
			$x++;
		}
//		sort($os);
//pr($os);
		
		$insurances = $this->Insurance->find('list');

		// Calculo la Edad de la Persona
		$edad = $this->obtenerEdad($this->data['Person']['fecha_nacimiento']);
		$this->set('edad', $edad);

		$statepeople 	 = $this->Person->Stateperson->find('list');
		$genders 		 = $this->Person->Gender->find('list');
		$sexes 			 = $this->Person->Sex->find('list');
		$typodocuments 	 = $this->Person->Typodocument->find('list', array('order' => array('Typodocument.name')));
		$gruposanguineos = $this->Person->Gruposanguineo->find('list');
		$this->set(compact('statepeople','genders', 'sexes', 'typodocuments', 'gruposanguineos','insurances','os'));
	}

	
	function autoComplete() {
		//Partial strings will come from the autocomplete field as
		//$this->data['Post']['subject'] 

		$txt_busqueda = $this->params['url']['q'];

		$setDatos = $this->Person->query(
			"SELECT 
				Person.id, Person.id,Person.name,Person.name2, Person.name3, Person.lastname, Person.lastname2, Person.lastname3
			FROM 
				people AS Person
			WHERE
				Person.name <> '' AND
				Person.name IS NOT NULL AND
				Person.lastname <> '' AND 
				Person.lastname IS NOT NULL AND
				(
					Person.name LIKE '%".$txt_busqueda."%' OR 
					Person.name LIKE '".$txt_busqueda."%' OR 
					Person.name LIKE '%".$txt_busqueda."' OR 
					Person.name = '".$txt_busqueda."' OR

					Person.name2 LIKE '%".$txt_busqueda."%' OR 
					Person.name2 LIKE '".$txt_busqueda."%' OR 
					Person.name2 LIKE '%".$txt_busqueda."' OR 
					Person.name2 = '".$txt_busqueda."' OR

					Person.name3 LIKE '%".$txt_busqueda."%' OR 
					Person.name3 LIKE '".$txt_busqueda."%' OR 
					Person.name3 LIKE '%".$txt_busqueda."' OR 
					Person.name3 = '".$txt_busqueda."' OR

					Person.lastname LIKE '%".$txt_busqueda."%' OR 
					Person.lastname LIKE '".$txt_busqueda."%' OR 
					Person.lastname LIKE '%".$txt_busqueda."' OR 
					Person.lastname = '".$txt_busqueda."' OR

					Person.lastname2 LIKE '%".$txt_busqueda."%' OR 
					Person.lastname2 LIKE '".$txt_busqueda."%' OR 
					Person.lastname2 LIKE '%".$txt_busqueda."' OR 
					Person.lastname2 = '".$txt_busqueda."' OR

					Person.lastname3 LIKE '%".$txt_busqueda."%' OR 
					Person.lastname3 LIKE '".$txt_busqueda."%' OR 
					Person.lastname3 LIKE '%".$txt_busqueda."' OR 
					Person.lastname3 = '".$txt_busqueda."' 
				)
			ORDER BY 
				lastname, name;
			"
		);

		if(count($setDatos) == 0){
			$setDatos = array();
		}

		$this->set('personas', $setDatos);
		$this->set('txt_busqueda', $txt_busqueda);
		$this->layout = 'ajax';
	}

	function search() {
		$this->_accede('busca_paciente');
		
		$sexes = $this->Person->Sex->find('list');
		$typodocuments = $this->Person->Typodocument->find('list', array('order' => array('Typodocument.name')));

		if (!empty($this->data)) {

			// Valido los campos ingresados
			if(!empty($this->data['Person']['name'])){
				$sql_nombre = " name:".urlencode($this->data['Person']['name']);
			}else{
				$sql_nombre = "";
			}

			if(!empty($this->data['Person']['name2'])){
				$sql_nombre2 = " name2:".urlencode($this->data['Person']['name2']);
			}else{
				$sql_nombre2 = "";
			}

			if(!empty($this->data['Person']['lastname'])){
				$sql_lastname = "lastname:".urlencode($this->data['Person']['lastname']);
			}else{
				$sql_lastname = "";
			}

			if(!empty($this->data['Person']['lastname2'])){
				$sql_lastname2 = " lastname2:".urlencode($this->data['Person']['lastname2']);
			}else{
				$sql_lastname2 = "";
			}

			if(!empty($this->data['Person']['fecha_nacimiento']['year']) AND !empty($this->data['Person']['fecha_nacimiento']['month']) AND !empty($this->data['Person']['fecha_nacimiento']['day'])){
				$sql_fecha_nacimiento = " fecha_nacimiento:".urlencode($this->data['Person']['fecha_nacimiento']['year']."-".$this->data['Person']['fecha_nacimiento']['month']."-".$this->data['Person']['fecha_nacimiento']['day']);
			}else{
				$sql_fecha_nacimiento = "";
			}

			if(!empty($this->data['Person']['typodocument_id'])){
				$sql_typodocument = " tipo_documento:".urlencode($typodocuments[$this->data['Person']['typodocument_id']]);
			}else{
				$sql_typodocument = "";
			}

			if(!empty($this->data['Person']['sex_id'])){
				$sql_sexo = " sexo:".urlencode($sexes[$this->data['Person']['sex_id']]);
			}else{
				$sql_sexo = "";
			}

			if(!empty($this->data['Person']['nro_documento'])){
				$sql_nro_documento = " nro_documento:".urlencode($this->data['Person']['nro_documento']);
			}else{
				$sql_nro_documento = "";
			}

			$txt_busqueda = trim($sql_lastname.$sql_nro_documento.$sql_nombre.$sql_nombre2.$sql_lastname2.$sql_fecha_nacimiento.$sql_typodocument.$sql_sexo);

			// Obtengo los datos solicitados con PRECISION EXACTA
			$setDatos = $this->obtenerDatossolr($txt_busqueda);

			// Si no hubo resultados exactos, extiendo la Busqueda por aproximación
			if(isset($setDatos) AND $setDatos['response']['result']['numFound'] == 0){
				// Obtengo los datos solicitados con PRECISION APROX.
				$setDatos = $this->obtenerDatossolr($txt_busqueda,0, 100000000, "", true);
			}

			$this->set('ResultadoPersonas', $setDatos);
			$this->set('busquedarealizada', "S");
		}


		$this->set(compact('sexes', 'typodocuments'));
	}

	function find() {
        $this->layout = 'ventana_flotante';

		// Si se realizo una Busqueda
		if (!empty($this->data)) { 

			$txt_busqueda = $this->data['Person']['name'];
			$txt_busqueda = "lastname:$txt_busqueda lastname2:$txt_busqueda lastname3:$txt_busqueda name:$txt_busqueda name2:$txt_busqueda name3:$txt_busqueda";

			// Obtengo los datos solicitados con PRECISION EXACTA
			$setDatos = $this->obtenerDatossolr($txt_busqueda);

			// Si no hubo resultados exactos, extiendo la Busqueda por aproximación
			if(isset($setDatos) AND $setDatos['response']['result']['numFound'] == 0){
				// Obtengo los datos solicitados con PRECISION APROX.
				$setDatos = $this->obtenerDatossolr($txt_busqueda,0, 100000000, "", true);
			}

			$this->set('ResultadoPersonas', $setDatos);
			$this->set('busquedarealizada', "S");
		}
	}

	function mostrartags($id_paciente = null) {

		if(!$id_paciente){
			exit;
		}

		$tags_paciente = $this->Person->query(
			"SELECT 
				Problem.name, Tag.name
			FROM 
				people_problems AS PeopleProblem 
				INNER JOIN tags AS Tag ON Tag.id = PeopleProblem.tag_id
				INNER JOIN problems AS Problem ON Problem.id = PeopleProblem.problem_id
			WHERE
				PeopleProblem.person_id =  '$id_paciente'
			ORDER BY 
				Problem.name
			"
		);

		$this->set('tags_paciente', $tags_paciente);
		$this->layout = 'ajax';
	}


	function totalpersonas(){

		// Obtengo los datos solicitados
		$setDatos = $this->obtenerDatossolr("*:*");

		$this->autoRender=false;

		return $setDatos['response']['result']['numFound'];
	}

	function obtenerDatossolr($txt_busqueda = null,$comienzo = 0, $paginar_de_a = 20, $sort = "", $activar_cercania = false){

		if(!$txt_busqueda){
			return array();
		}else{
			// import XML class 
			App::import('Xml'); 


			if($activar_cercania == true){
				// Agrego caracter ~ al final de cada palabra para habilitar la proximity de la busqueda
				
				//$txt_busqueda = str_replace(" ", "~ ", $txt_busqueda); 
				//$txt_busqueda .= "~";

				$txt_busqueda = str_replace(" nro_documento:", "~ nro_documento:", $txt_busqueda); 
				$txt_busqueda = str_replace(" name:", "~ name:", $txt_busqueda); 
				$txt_busqueda = str_replace(" fecha_nacimiento", "~ fecha_nacimiento", $txt_busqueda); 
			}

			if(!empty($sort)){
				$str_sort = "&sort=".$sort;
			}else{
				$str_sort = "";
			}

			// Leemos nuestro archivo XML
			$url_solr = 'http://localhost:8080/solr/core1/select?indent=on&version=2.2&q='.urlencode(strtolower($txt_busqueda)).'&fq=%2Bcat%3Aperson+%2Bid_cliente%3A'.$this->Session->read('ClientesUsuarioLogueado.id').'&start='.$comienzo.$str_sort.'&rows='.$paginar_de_a.'&fl=cat%2Cfecha_nacimiento%2Cid%2Clastname%2Clastname2%2Clastname3%2Cname%2Cname2%2Cname3%2Cnro_documento%2Csexo%2Ctipo_documento%2Cscore&qt=standard&wt=standard&explainOther=&hl.fl=';

			$xml_content =& new XML($url_solr);

			// Para facilidad de uso convertimos nuestro archivo XML en un arreglo legible.
			return $xml_content->toArray(false);
		}
	}


	function actualizarPersonas(){
		// Vacio el Listado de Pacientes del Cliente Logueado
		Cache::delete('lst_pacientes_quick_'.$this->Session->read('ClientesUsuarioLogueado.id') );

		Cache::delete('pacientescache_'.$this->Session->read('ClientesUsuarioLogueado.id') );


		/* ==================================================================== */
		/* Indexo las Personas en solr										    */
		/* ==================================================================== */

			// import XML class 
			App::import('Xml'); 

			// Leemos nuestro archivo XML
//			$url_solr = 'http://localhost:8080/solr/core1/dataimport?command=full-import&clean=true';  // Indexacion Full
			$url_solr = 'http://localhost:8080/solr/core1/dataimport?command=delta-import'; // Indexacion Delta
			$xml_content =& new XML($url_solr);

		/* ==================================================================== */

		$this->autoRender=false;
	}

	// GETTER PACIENTES DE UN CLIENTE
	function getjsonpacientes() {

		if(!$json_output = Cache::read('lst_pacientes_quick_'.$this->Session->read('ClientesUsuarioLogueado.id') )){

			$setDatos_aux = $this->Person->query(
				"
					SELECT Person.id, Person.name, Person.name2, Person.name3, Person.lastname, Person.lastname2, Person.lastname3, Person.fecha_nacimiento, InsurancePeople.nombre_plan, InsurancePeople.nro_afiliado
					FROM
						people AS Person
						INNER JOIN clients_people AS t2 ON t2.person_id = Person.id
						LEFT JOIN insurances_people AS InsurancePeople ON InsurancePeople.person_id = Person.id
					WHERE
						t2.client_id = '".$this->Session->read('ClientesUsuarioLogueado.id')."' AND Person.stateperson_id = 1
					ORDER BY
						Person.lastname, Person.lastname2, Person.lastname3, Person.name, Person.name2, Person.name3
				;"
			);

			$contador=0;
			$cada_registro="";

			foreach($setDatos_aux AS $registro){
				$contador++;

				if($contador <>1){
					$cada_registro .= ',';
				}

				$apellido_aux = trim($registro['Person']['lastname'] . " " . $registro['Person']['lastname2'] . "" . $registro['Person']['lastname3']);
				$nombre_aux = trim($registro['Person']['name'] . " " . $registro['Person']['name2'] . "" . $registro['Person']['name3']);
				$nro_afiliado_aux = trim($registro['InsurancePeople']['nro_afiliado']);
				$edad_aux = $this->obtenerEdad($registro['Person']['fecha_nacimiento']);

				$cada_registro .= '{"name": "'.$apellido_aux.", ".$nombre_aux." (".$edad_aux['edad'].$edad_aux['unidad_edad'].") <div>$nro_afiliado_aux</div>".'","id": '.$registro['Person']['id'].'}';
			}

			$json_output = '{"person":['.$cada_registro.']}';

			Cache::write('lst_pacientes_quick_'.$this->Session->read('ClientesUsuarioLogueado.id'), $json_output);
		}

		$this->autoRender=false;
		return $json_output;
	}

	function listado($comienzo = 0,$paginar_de_a = 20) {
		$this->_accede('lista_paciente');
	}

	// LISTADO PAGINADO DE PACIENTES
	function obtenerlistadopacientes($comienzo = 0,$paginar_de_a = 20) {
		$this->layout = 'ajax';

		$txt_busqueda = "*:*";

		// Obtengo los datos solicitados
		$setDatos = $this->obtenerDatossolr($txt_busqueda,$comienzo,$paginar_de_a, "lastname+asc");


		if($setDatos){
			// Si tiene más de 1 Registro
			if($setDatos['response']['result']['numFound'] > 1){

				$this->Person->unbindModel(array(
					'hasMany' => array('Evolution','Recomendation','PeoplePractice','PeopleProblem','PeopleRecomendation','Agenda','PeopleSign','PeopleVademecum','Person','Result','Turn'),
					'belongsTo' => array('Stateperson','Gender','Sex','Typodocument','Gruposanguineo'),
					'hasAndBelongsToMany' => array('Client'),
					));            		

				foreach($setDatos['response']['result']['doc'] as $clave=>$valor){
					$id_paciente = $valor['str']['2']['value'];
					$paciente = $this->Person->read(null, $id_paciente);
					$estado = $paciente['Person']['stateperson_id'];
					$setDatos['response']['result']['doc'][$clave]['str']['12']['name'] = 'stateperson_id';
					$setDatos['response']['result']['doc'][$clave]['str']['12']['value'] = $estado;
				}

			}else{ // Si tiene exactamente 0 o 1 Registro
				if($setDatos['response']['result']['numFound'] != 0){
					$id_paciente = $setDatos['response']['result']['doc']['str']['2']['value'];
					$paciente = $this->Person->read(null, $id_paciente);
					$estado = $paciente['Person']['stateperson_id'];
					$setDatos['response']['result']['doc']['str']['12']['name'] = 'stateperson_id';
					$setDatos['response']['result']['doc']['str']['12']['value'] = $estado;
				}					
			}
		}

		$this->set('ResultadoPersonas', $setDatos);
	}

	// Exportar csz listado de Pacientes
	function exportar_listado_pacientes() {
        $this->layout = '';
		
		$client_id = $this->Session->read('Client.id');

		$this->ClientsPerson->unbindModel(array('belongsTo' => array('Client')));            	

		$Pacientes = $this->ClientsPerson->find('all',array(
											'conditions'=>array('client_id'=>$client_id),
											'order'=>'Person.lastname ASC, Person.name ASC'
										));

		
		$nombre_temporal = 'MisPacientes al '.date("Y-m-d-Hi").'.csv';
		$destino = ROOT.DS.'app'.DS.'webroot'.DS.'temp/'.$nombre_temporal;		

		$fp = fopen("$destino", 'w');

		$renglon = "Apellido y Nombre;Telefono;Email;Estado\n";
					
		fwrite($fp, $renglon);

		foreach($Pacientes as $b) {
			if($b['Person']['stateperson_id']==1){	$estado = 'Activo'; } else { $estado='Inactivo'; }
			$renglon = "{$b['Person']['full_name']};{$b['Person']['telefono']};{$b['Person']['email']};$estado\n";
			fwrite($fp, $renglon);
		}

		fclose($fp);
		$file = $this->webroot.'temp/'.$nombre_temporal;
		

		header("Content-disposition: attachment; filename=$nombre_temporal");
		header("Content-type: application/csv");
		readfile($destino);
		unlink($destino);

		
	}

	// Obtengo la Edad de un Paciente
	function obtenerEdad($fecha_nacimiento = null, $return_data = "Y"){

		// Si no esta definida la Fecha de nacimiento
		if(!$fecha_nacimiento){
			return "-";
		}

		// Calculo la edad expresada en AÑOS del Paciente
		if($return_data == "Y"){
			// Calculo la Edad de la Persona
			$mktime_hoy = date("Y");
			$mktime_fecha_nacimiento = date("Y", strtotime($fecha_nacimiento));

			if(date("n", strtotime($fecha_nacimiento)) > date("n")){ // Si todavía no cumplio años
				$mktime_fecha_nacimiento++;
			}elseif(date("n", strtotime($fecha_nacimiento)) == date("n") AND date("j", strtotime($fecha_nacimiento)) > date("j")){
				$mktime_fecha_nacimiento++;
			}

			$edad = $mktime_hoy-$mktime_fecha_nacimiento;
			$unidad_edad = "años";
		}

		// Calculo la edad expresada en DIAS del Paciente / Si la edad en años es 0, la paso a días
		if($return_data == "D" OR $edad == 0){
			// Calculo la Edad de la Persona
			$mktime_hoy = strtotime("now");
			$mktime_fecha_nacimiento = strtotime($fecha_nacimiento);

			$edad = round(($mktime_hoy-$mktime_fecha_nacimiento)/86400);
			$unidad_edad = "días";			
		}

		$array_edad['edad'] = $edad;
		$array_edad['unidad_edad'] = $unidad_edad;

		return $array_edad;
	}
	
	// Exportador a PDF
    function viewPdf($id_paciente = null, $fecha='',$solo_form=0){ 

    	$this->_accede('imprime_hce');

		$this->Person->recursive = 0;

		if( !empty($fecha) ){
			list($dia, $mes, $ano) = explode('-',$fecha);
			$fecha = $ano.'-'.$mes.'-'.$dia;
		}

		if (!$id_paciente) {
			exit;
		}

		// Verifico que el Paciente corresponda al Cliente
		$valido_cliente = $this->Person->ClientsPerson->find('first', array(
								'conditions' => array(
													'ClientsPerson.person_id' => $id_paciente,
													'ClientsPerson.client_id' => $this->Session->read('ClientesUsuarioLogueado.id'),
												),
				) );

		if(!empty($valido_cliente)){
			$datos_persona = $this->Person->read(null, $id_paciente);
		}else{
			exit;
		}

		// Calculo la Edad de la Persona
		$edad = $this->obtenerEdad($datos_persona['Person']['fecha_nacimiento']);
		$this->set('edad', $edad);

		$this->set('person', $datos_persona);

		if($solo_form==1){
			//$this->set('fichas',         $this->requestAction("/registros/ObtenerRegistros/$id_paciente/10/0/$fecha") );

			$historial_completo = array_merge(
			$this->requestAction("/registros/ObtenerRegistros/$id_paciente/10/0/$fecha")
			);

		} else {
			// $this->set('evoluciones',    $this->requestAction("/registros/ObtenerRegistros/$id_paciente/1/0/$fecha") );
			// $this->set('problemas',      $this->requestAction("/registros/ObtenerRegistros/$id_paciente/4/0/$fecha") );
			// $this->set('signos',         $this->requestAction("/registros/ObtenerRegistros/$id_paciente/6/0/$fecha") );
			// $this->set('practicas',      $this->requestAction("/registros/ObtenerRegistros/$id_paciente/3/0/$fecha") );
			// $this->set('resultados',     $this->requestAction("/registros/ObtenerRegistros/$id_paciente/5/0/$fecha") );
			// $this->set('vademecum',      $this->requestAction("/registros/ObtenerRegistros/$id_paciente/2/0/$fecha") );
			// $this->set('turnos',         $this->requestAction("/registros/ObtenerRegistros/$id_paciente/7/0/$fecha") );
			// $this->set('recomendaciones',$this->requestAction("/registros/ObtenerRegistros/$id_paciente/8/0/$fecha") );
			// $this->set('fichas',         $this->requestAction("/registros/ObtenerRegistros/$id_paciente/10/0/$fecha") );

			$historial_completo = array_merge(
			$this->requestAction("/registros/ObtenerRegistros/$id_paciente/1/0/$fecha"),
			$this->requestAction("/registros/ObtenerRegistros/$id_paciente/4/0/$fecha"),
			$this->requestAction("/registros/ObtenerRegistros/$id_paciente/6/0/$fecha"),
			$this->requestAction("/registros/ObtenerRegistros/$id_paciente/3/0/$fecha"),
			$this->requestAction("/registros/ObtenerRegistros/$id_paciente/5/0/$fecha"),
			$this->requestAction("/registros/ObtenerRegistros/$id_paciente/2/0/$fecha"),
			$this->requestAction("/registros/ObtenerRegistros/$id_paciente/7/0/$fecha"),
			$this->requestAction("/registros/ObtenerRegistros/$id_paciente/8/0/$fecha"),
			$this->requestAction("/registros/ObtenerRegistros/$id_paciente/10/0/$fecha")
			);
		}

		// Si hay varios elementos
		if(count($historial_completo) > 1){

			// Obtain a list of columns for latest use for order
			foreach ($historial_completo as $key => $row) {
			    $array_fecha[$key]  = $row['fecha'];
			    $array_modelo[$key] = $row['modelo'];
			}

			// Sort the data with volume descending, modelo ascending
			// Add $historial_completo as the last parameter, to sort by the common key
			array_multisort($array_fecha, SORT_DESC, $array_modelo, SORT_ASC, $historial_completo);
		}

		$this->set('historial_completo',$historial_completo);


        $this->layout = 'pdf'; //this will use the pdf.ctp layout 
        $this->render(); 
    } 

    function obtenerFinanciadores($id_paciente = null) {

		if(!$id_paciente){
			exit;
		}

		// Obtengo las Obras Sociales del Paciente
		$options      = array('conditions' => array('InsurancesPerson.person_id' => $id_paciente));
		$insurances_paciente = $this->InsurancesPerson->find('all', $options);    	

		return $insurances_paciente;		
    }


	function DesactivarPaciente($id = null) {
		
		if (!$id && empty($this->data)) {
			$this->Session->setFlash(__('Invalid person', true));
			$this->redirect('/dashboards');
		} else {
			$paciente = $this->Person->read(null, $id);		
			$paciente['Person']['stateperson_id'] = 2;

			// Se actualizan las Personas y el listado Rapido de Pacientes
			$this->actualizarPersonas();

			$this->Person->save($paciente['Person']);
			$this->redirect(array('action' => 'listado'));			
			die();
		}
	}



    function exportprescription($prescription_id = 0){ 
    	//---------------------------------------------------------------------
    	// Exporta la prescripcion realizada: tipo_prescripcion: practicas / medicamentos
    	//---------------------------------------------------------------------	
		$client_id       = $this->Session->read('ClientesUsuarioLogueado.id');
		$user_id         = $this->Auth->user('id');

		$this->_accede('imprime_hce');

		$this->loadModel('Recetario');
		$Recetario = $this->Recetario->find('first', array(
												'conditions' => array(
													'Recetario.client_id' => $client_id,
													'Recetario.user_id'   => $user_id
												),
											) );
		if(!empty($Recetario)){
			$encabezado = trim(strip_tags( $Recetario['Recetario']['encabezado'] ));
			$pie        = trim(strip_tags( $Recetario['Recetario']['pie']) ).'<br/>';
		} else {
			$encabezado = ''; 
			$pie        = '';
		}
		$this->set('encabezado',$encabezado);		
		$this->set('pie',$pie);
		$this->set('prescription_id',$prescription_id);


		$this->loadModel('Prescription');
		$Prescription = $this->Prescription->find('first', array(
												'conditions' => array(
													'Prescription.client_id' => $client_id,
													'Prescription.user_id'   => $user_id,
													'Prescription.id'        => $prescription_id
						
												),
											) );

		//------------------------------------------------------------------
		//                                             Registro del Paciente
		//------------------------------------------------------------------
		$paciente_id = $Prescription['Prescription']['person_id'];
		$Paciente = $this->Person->read(null,$paciente_id);

	
		$client_tz = new DateTimeZone($_SESSION['Client']['timezone']);

		if($Prescription['Prescription']['tipo_prescripcion']=='practicas'){
			//-----------------------------------------------------------------------------
			//                                                           Si es una practica
			//-----------------------------------------------------------------------------
			$this->set('TipoPrescripcion' ,'Prescripcion de Practicas');
			$this->loadModel('PeoplePractice');
			$this->PeoplePractice->unbindModel(array('belongsTo' => array('Client','Person','User','Staterecord')));   
			$Practicas = $this->PeoplePractice->find('all', array(
												'conditions' => array(
													'PeoplePractice.prescription_id' => $prescription_id
												),
											) );
			$Renglones = array();
			//-------------------------------------- Armo el array de detalle para hacer el pdf
			foreach ($Practicas as $key => $value) {
				$r = array();

				// Cambio la fecha segun el TimeZone del Cliente
				$x = substr($value['PeoplePractice']['fecha'],0,10);
				list($ano,$mes,$dia) = explode('-',$x);
				$fecha      = $dia.'-'.$mes.'-'.$ano;
				$date = new DateTime($fecha);
				$date->setTimezone($client_tz);
				$r['fecha'] =  $date->format('d-m-Y');		

				$r['comentario'] = $value['PeoplePractice']['comments'];
				$r['item_id']    = $value['PeoplePractice']['practice_id'];
				$r['item_name']  = $value['Practice']['name'];
				$Renglones[] = $r;
			}

		} elseif($Prescription['Prescription']['tipo_prescripcion']=='medicamentos') {
			//-----------------------------------------------------------------------------
			//                                                         Si es un medicamento
			//-----------------------------------------------------------------------------
			$this->set('TipoPrescripcion' ,'Prescripcion de Medicamentos');
			$this->loadModel('PeopleVademecum');
			$this->PeopleVademecum->unbindModel(array('belongsTo' => array('Client','Person','User','Staterecord')));   
			$Medicamentos = $this->PeopleVademecum->find('all', array(
												'conditions' => array(
													'PeopleVademecum.prescription_id' => $prescription_id
												),
											) );
			
			//-------------------------------------- Chequea si usa el vademecum generico
			foreach ($Medicamentos as $key => $value) {

				if($value['PeopleVademecum']['nombre_vademecum']!='vademecums'){
					unset($Medicamentos[$key]['Vademecum']);
					$vademecum_usado = $value['PeopleVademecum']['nombre_vademecum'];
					$vademecum_id    = $value['PeopleVademecum']['vademecum_id'];
					$sql = "select name, presentacion from $vademecum_usado as vademecum where id='$vademecum_id'";
					$xx = $this->Sign->query($sql);
					//pr($xx);
					$Medicamentos[$key]['Vademecum']['name'] = $xx[0]['vademecum']['name'].' '.$xx[0]['vademecum']['presentacion'];
				}
			}

			//-------------------------------------- Armo el array de detalle para hacer el pdf
			$Renglones = array();
			foreach ($Medicamentos as $key => $value) {
				$r = array();

				// Cambio la fecha segun el TimeZone del Cliente
				$x = substr($value['PeopleVademecum']['fecha_inicio'],0,10);
				list($ano,$mes,$dia) = explode('-',$x);
				$fecha      = $dia.'-'.$mes.'-'.$ano;
				$date = new DateTime($fecha);
				$date->setTimezone($client_tz);
				$inicio =  $date->format('d-m-Y');		

				if( $value['PeopleVademecum']['fecha_inicio']!=$value['PeopleVademecum']['fecha_fin'] ){
					$x = substr($value['PeopleVademecum']['fecha_fin'],0,10);
					list($ano,$mes,$dia) = explode('-',$x);
					$fecha      = $dia.'-'.$mes.'-'.$ano;
					$date = new DateTime($fecha);
					$date->setTimezone($client_tz);
					$fin = ' al '. $date->format('d-m-Y');		
				} else { $fin=''; }


				$r['fecha']      = $inicio.$fin;
				$r['comentario'] = $value['PeopleVademecum']['observaciones'];
				$r['item_id']    = $value['PeopleVademecum']['nombre_vademecum'].'-'.$value['PeopleVademecum']['vademecum_id'];
				$r['item_name']  = $value['Vademecum']['name'];

				if($value['PeopleVademecum']['cantidad_indicada']>0){
					$cantidad_indicada = "Cantidad:".$value['PeopleVademecum']['cantidad_indicada'];	
				} else { $cantidad_indicada='';}
				
				$unidad_indicada   = "Unidad:".$value['Unidad']['name'];
				$via               = "Via:".$value['Via']['name'];
				if($value['PeopleVademecum']['frecuencia']>0){
					$frecuencia        = "Frecuencia:".$value['PeopleVademecum']['frecuencia'].' '.$value['Frecuencia']['name'];	
				} else { $frecuencia='';}

				if($value['PeopleVademecum']['typeindicacionmedicamento_id']>0){
					$indicacion   = "Indicacion:".$value['Typeindicacionmedicamento']['name'];	
				} else { $indicacion='';}

				$r['detalle'] = $cantidad_indicada.' '.$unidad_indicada.' '.$via.' '.$frecuencia.' '.$indicacion;

				$Renglones[] = $r;
			}




		}

		//pr($_SESSION);

		// Calculo la Edad de la Persona
		$edad = $this->obtenerEdad($Paciente['Person']['fecha_nacimiento']);
		$this->set('edad', $edad);

		$this->set('person', $Paciente);

		$this->set('historial_completo',$Renglones);

        $this->layout = 'pdf'; //this will use the pdf.ctp layout 
        $this->render(); 
    } 




}
?>